#ifndef _VERTEX_H_
#define _VERTEX_H_

#include "Maths.h"
#include "Vector.h"


namespace Math{

/**
 * Classe de sommet (vertex)
 *
 * Un sommet est un point dans l'espace (un vecteur)
 */       
class MATH_API Vertex
{
 public:
    /**
     * constructeur par défaut
     */
    Vertex();
    /**
     * construit a partir de floats
     */
    Vertex(float x,float y, float z, float w=0);
    /**
     * construit à partir d'un Vector
     * @param position vecteur de position
     * @param normal normale du sommet
     * @param uv position uv du sommet
     * @param w poids du sommet
     */
    Vertex(Vector position,Vector normal,Vector uv,float w);
    /**
     * Retourne la position du sommet
     */
    Vector& getPosition();
    /**
     * Donne un poids au sommet
     * @param w le poids
     */
    void setWeight(float w){m_Weight=w;}
    /**
     * @return le poids du sommet
     */
    float& getWeight(){return m_Weight;}
    /**
     * Donne une normale au sommet
     * @param n normale
     */
    void setNormal(Vector n){m_Normal = n;};
    /**
     * @return la normale du sommet
     */
    Vector getNormal(){return m_Normal;};
    /**
     * Donne une coordonnée uv au sommet
     * @param uv coordonnée
     */
    void setTextureUV(Vector uv){m_uv = uv;};

    /**
     *@return la coordonnee UV
     */
    Vector& getTextureUV(){return m_uv;};
    
    /**
     * Retourne le vecteur qui sépare deux points dans l'espace
     */
    static Vector vectorFromVertices(Vertex A,Vertex B);
    
    /**
     * @return vrai si le sommet a sa propre normale
     */
    bool hasNormal(){return m_hasNormal;};

    /**
     * Rajoute une normale au sommet
     * @param v la normale
     */
    void addNormal(Vector& v);
    /**
     * normalise la normale du sommet
     */
    void normalize(){m_Normal.normalize();}
    /**
     * test d'égalité entre deux Vertex
     */
    bool operator==(Vertex& o){
        return (m_Position==o.m_Position);
    };
 private:
    Vector m_Position; 	///< la position du sommet
    float m_Weight;    	///< poids du sommet
    Vector m_Normal;   	///< la normale du sommet
    Vector m_uv;		///< coordonnées uv du sommet
    bool   m_hasNormal;	///< vrai si le sommet a sa propre normale
}; 

}

#endif
